home *** CD-ROM | disk | FTP | other *** search
/ Merciful 4 / Merciful - Disc 4.iso / software / p / psychotoads.dms / psychotoads.adf / a1516 < prev    next >
Text File  |  1989-03-31  |  52KB  |  1,508 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.                         15: BACKGROUND GRAPHICS                            207
  10.                     ------------------------------
  11.  
  12. Nowadays, it's not uncommon for an arcade game to contain hunderds of
  13. different screens. With compaction, it's possible to crap a single 32
  14. colour screen into about 30k of memory. So 100 screens would be the
  15. equivalent of about 3 Megabytes of data. Imagine how difficult this
  16. would be to fit into a standard A500! 
  17.  
  18.   The classic way of avoiding this restriction, is to construct your
  19. backgrounds out of a set of simple building blocks. Once these "tiles"
  20. have been created, they can be placed on the screen in any order you
  21. like. So the same set of tiles can be reused to generate a vast number
  22. of potential screens. Each screen is now stored as a simple list of its
  23. components, and requires a tiny fraction of the original memory.
  24.  
  25.   In order to exploit this system, you'll obviously need some way of
  26. defining your various screen maps. As you might have guessed, we've
  27. helpfully provided you with a powerful map definer accessory on the
  28. AMOS program disc. Full details can be found in the accompanying
  29. documentation file.
  30.  
  31.   AMOS Basic also includes a number of special instructions for drawing
  32. your tiles on the screen. These make it easy to generate the fast
  33. scrolling backgrounds that are the hallmark of a modern arcade game.
  34.  
  35.  
  36. Icons
  37. =====
  38. Icons are separate images which have been especially designed for
  39. producing your background screens. Once you've drawn an icon, it's
  40. fixed permanently into place. So you can't move it to a new position
  41. using the AMAL animation system.
  42.  
  43.   All icons are stored in their own AMOS memory bank (#2). This bank is
  44. created using the Sprite definer accessory (on the AMOS Program disk),
  45. and will be automatically saved along with your Basic programs.
  46.  
  47.   Like Bobs, Icons are displayed using the Amiga's amazing Blitter
  48. chip. But since Icons are essentally static objects, they are usually
  49. drawn in REPLACE mode. Your icons will therefore totally erase any
  50. existing graphics at the current screen position.
  51.  
  52.  
  53.  
  54.                        PASTE ICON (draw an icon)
  55.  
  56. PASTE ICON x,y,n
  57.  
  58. Draws icon number n on the screen at GRAPHIC coordinates x,y. n is the
  59. number of the icon which is to be displayed. This must have been
  60. previously stored in the ICON bank. 
  61.  
  62.   Icons can be freely positioned anywhere on the screen, subject to the
  63. normal clipping rules. Example:
  64.  
  65.         Load "AMOS_DATA:Icons/Map_icons.abk"
  66.         Screem Open 0,320,256,32,Lowres : Cls 0 : Get Icon Palette
  67.         For X=1 To 11 : Paste Icon X*32,0,1 : Next X
  68.         For Y=1 To 6 : Paste Icon 0,Y*32+11 : Paste Icon 288,Y*32,1
  69.         Next Y
  70.         For X=1 To 11 : Paste Icon X*32,223,1 : Next X
  71.  
  72. Note that if you're using double buffering, a copy of your icons will
  73. be drawn into both the physical and logical screens. Since this is
  74. rather slow, it's common practive to add a call to AUTOBACK 0 before
  75. drawing your icons on the screen. This restricts straight to the
  76. physical screen using SCREEN COPY, saving a considerable amount of
  77. time. 
  78.  
  79.   For a further example, see the MAPVIEW program on the AMOS DATA disc.
  80. This displays a background screen you've created using the AMOS Map
  81. Editor.
  82.  
  83.  
  84.  
  85.                        GET ICON (create an icon)                           208
  86.  
  87. GET ICON [s,] i,tx,ty TO bx,by
  88.  
  89. Captures an image from the screen and loads it into icon "i". If this
  90. icon does not presently exist, it will be created for you in bank 2.
  91. This bank will be automatically reserved by the system if required.
  92.  
  93.   i is the number of your icon, starting from 1. tx,ty to bx,by define
  94. the rectangular zone which encloses the selected region.
  95.  
  96.   s determines the number of the screen which will be used as the
  97. source of your image. If it's omitted, the image will be taken from the
  98. current screen instead. Example:
  99.  
  100.         Erase 2
  101.         F$=Fsel$("*.*","","Load a screen") : If F$="" Then Direct
  102.         If Exist(f$) Then Load Iff f$,0 Else Direct
  103.         SH=Screen Height : H=SH/32-1 : SW=Screen Width : W=SW/32-1
  104.         For Y=0 to H
  105.           For X=0 to W
  106.             Get Icon X+Y*W+1,X*32,Y*32 To X*32+31,Y*32+31
  107.           Next X
  108.         Next Y
  109.         Cls 0
  110.         Do
  111.           Paste Icon Rnd(Sw-1),Rnd(SH-1),Rnd/(H*W)+1
  112.         Loop
  113.  
  114.  
  115.  
  116.                   GET ICON PALETTE (get icon colours)
  117.  
  118. GET ICON PALETTE
  119.  
  120. Grabs the colours of the icon images in bank 2, and loads them into the
  121. current screen palette. This command is normally used to initialize the
  122. screen after you'be loaded some icons from the disc. Example:
  123.  
  124.         Load "AMOS_DATA:Icons/Map_icons.abk"
  125.         Get Icon Palette
  126.         Paste Icon 100,100,1
  127.  
  128.  
  129.  
  130.                        DEL ICON (deletes icons)                            209
  131.  
  132. DEL ICON n[ TO m]
  133.  
  134. Deletes one or more icons from the icon bank. n is the number of the
  135. first icon to be removed. 
  136.  
  137.   m is the optional number of the last icon to be deleted in the list.
  138. If it's included all the icons from first to last will be erased one
  139. after another.
  140.  
  141.   When the final icon in a bank has been deleted, the entire bank will
  142. be removed from memory.
  143.  
  144.  
  145.  
  146.             MAKE ICON MASK (set colour zero to transparent)
  147.  
  148. MAKE ICON MASK [n]
  149.  
  150. Normally, any icons you draw on the screen will completely replace the
  151. existing background. The icon will seem to be displayed in a
  152. rectangular box filled with colour zero.
  153.  
  154.   If you want to avoid this effect and overlay your icons directly over
  155. the current graphics, you'll need to create a *mask* for your icons.
  156. This informs AMOS that colour zero should be treated as transparent.
  157.  
  158.   n is the number of the icon to be affected. If it's omitted, a mask
  159. will be defined for all icons in the bank. See EXAMPLE 15.1
  160.  
  161.  
  162. Screen blocks
  163. =============
  164. AMOS Basic supplies you with a set of powerful BLOCK commands which
  165. allow you to grab part of an image into memory and paste it anywhere on
  166. the screen.
  167.  
  168.         These instructions are mainly used for holding temporary data,
  169. since your blocks cannot be saved along with your Basic programs.
  170.  
  171.   Blocks are especially effective in the construction of dialogue
  172. boxes, as they can be used to save the background areas before
  173. displaying your new graphics. 
  174.  
  175.   They can also be exploited in puzzle games like Split Personalities.
  176. Each block can be loaded with a single section of your image. You can
  177. then jumble your pictures by rearranging the blocks on the screen with
  178. PUT BLOCK.
  179.  
  180.  
  181.  
  182.               GET BLOCK (grab a screen block into memory)
  183.  
  184. GET BLOCK n,tx,ty,w,h[,mask]
  185.  
  186. GET BLOCK grabs a rectangular area in block number n, starting at
  187. coordinates tx,ty. 
  188.  
  189.   n is the number of the block ranging from 1-65535. tx, ty set the
  190. coordinates of the top left hand corner of your block. w,y hold the
  191. width and height of the block respectively.
  192.  
  193.   "mask" is a flag which chooses whether a mask will be created for
  194. your new block.
  195.  
  196.   mask=0        Replace mode. When the block is drawn on the screen,
  197.                 it will totally destroy any graphics at that current
  198.                 position.
  199.   mask=1        Calculates a mask for the block. Colour zero will now
  200.                 be treated as if it were transparent.
  201.  
  202.  
  203.  
  204.                 PUT BLOCK (copies a previously created                     210
  205.                         block onto the screen)
  206.  
  207. PUT BLOCK n[,x,y]
  208. PUT BLOCK n,x,y,planes[,minterms]
  209.  
  210. PUT BLOCK copies block number n to the current screen. x,y specify the
  211. position of your new block on the screen. If they are omitted the block
  212. will be redrawn at its original screen coordinates.
  213.  
  214.   Note that all drawing operations will be clipped to fit into the
  215. current screen, starting from the nearest 16 pixel boundary.
  216.  
  217.   For a demostration of the BLOCK commands see the routine in EXAMPLE
  218. 15.2. We've also provided experienced programmers with a couple of
  219. optional extras. These are not needed for the vast majority of
  220. applications, they're only required when you want to achieve weird
  221. special effects on the screen!
  222.  
  223.   "planes" holds a bit-map which sets the range of colours which will
  224. be drawn in your block. The Amiga's screen is divided up into segments
  225. known as bit-planes. Each plane contains a single bit for every point
  226. on the Amiga's screen. When the Amiga's hardware displays this point,
  227. it combines the bits from each plane to calculate the required colour
  228. number. Each bit in "planes" represents the status of a single
  229. bit-plane. If it's set to one, then the selected plane will be drawn by
  230. the instruction, otherwise it will be completely ignored. The first
  231. plane is represented by bit zero, the second by bit one, etc.
  232.  
  233.   Usually, the block will be displayed in all the available bit-planes.
  234. The corresponds to a bit-pattern of %111111
  235.  
  236.   "minterm" selects the blitter mode used to copy your block on the
  237. screen. A full description of the possible drawing modes can be found
  238. in the section on SCREEN COPY. The best way to loearn about these
  239. options is to experiment!
  240.  
  241.  
  242.  
  243.                    DEL BLOCK (delete a screen block)
  244.  
  245. DEL BLOCK n
  246.  
  247. Deletes one or more blocks and restores the memory used to AMOS Basic.
  248.  
  249. DEL BLOCK       Erases *all* current blocks
  250. DEL BLOCK n     Deletes block number n.
  251.  
  252.  
  253.  
  254.              GET CBLOCK (save and compact a screen image)                  211
  255.  
  256. GET BLOCK n,x,y,sx,sy
  257.  
  258. The GET BLOCK command saves and compacts a rectangular area of the
  259. screen. The compaction system used by this command has been especially
  260. optimized for speed. So it's nowhere near as efficient as the dedicated
  261. AMOS compression routines provided by the PACK or SPACK instructions.
  262.  
  263.   CBLOCKS are often used to grab the area underneath your dialogue
  264. boxes. After the dialogue has been completed, the screen can quickly
  265. restored back to its original state. See EXAMPLE 15.3.
  266.  
  267.   n specifies the number of your block and can range between 1-65535.
  268.  
  269.   x,y are the top left coordinates. The x coordinate is rouded to the
  270. nearest multiple of 8.
  271.  
  272.   w,h hold the dimensios of the area to be saved. The width is always
  273. rounded to an exact multiple of 8.
  274.  
  275.  
  276.  
  277.                      PUT CBLOCK (displays a block
  278.                          created using CBLOCK)
  279.  
  280. PUT CBLOCK n [,x,y]
  281.  
  282. Places block n on the current screen at coordinates x,y. If the target
  283. coordinates are omitted, the block will be redrawn at its original
  284. screen position. Also note that x is automatically rounded to the
  285. nearest eight pixel boundary.
  286.  
  287.  
  288.  
  289.                   DEL CBLOCK (deletes a screen block
  290.                        defined with GET CBLOCK)
  291.  
  292. DEL CBLOCK [n]
  293.  
  294. Erases all blocks from memory. If n is present only block n will be
  295. deleted.
  296.  
  297.  
  298.  
  299.  
  300.  
  301.  
  302.  
  303.                                16: MENUS                                   212
  304.                       ---------------------------
  305.  
  306. If you've used the Amiga for some time you'll already be familiar with
  307. the idea of menus. Impossible as it seems, AMOS has taken the existing
  308. system and improved it almost beyond recognition.
  309.  
  310.   Menus can be created with up to eight separate levels, and each
  311. individual menu item can be repositioned on the screen at will. Menu
  312. titles can be printed in any combination of colours or styles. You can
  313. also include bobs or icons directly in your menus using an amazing menu
  314. definition language.
  315.  
  316.   AMOS Basic is equally impressive when it comes to reading a menu.
  317. There's a buit-in interrupt-dricen ON MENU command which can
  318. automatically branch to a selected point in your program depending on
  319. the option selected. Furthermore, any menu option can be accessed
  320. directly from the keyboard using the MENU KEY instruction.
  321.  
  322.   For a demonstration of the terrific effects that can be achieved with
  323. this system, load the program EXAMPLE 16.1.
  324.  
  325.  
  326. Using a menu
  327. ============
  328. All AMOS menus are called up by holding down the right mouse button in
  329. the standard way. Once a menu has been activated you can then select an
  330. option directly with the mouse cursor. When you release the button, the
  331. option number you have chosen will be returned to your program.
  332.  
  333.   Menus can be repositioned by placing the mouse cursor over the top
  334. left corner of an item and holding down the LEFT button. A small box
  335. will now appear on the menu bar which can be dragged across the screen
  336. using the mouse.
  337.  
  338.   In addition, holding down the SHIFT key will freeze a menu into
  339. place. This allows you explore a menu without selecting any of the
  340. various options. You can also use any of the mouse features such as
  341. slowing or axis selection in conjunction with your menus.
  342.  
  343.  
  344. Creating a simple menu
  345. ======================
  346. AMOS menus can be created either directly within your programs or using
  347. a special menu definer included on the AMOS program disc.
  348.  
  349.   If you've never used menus before, the sheer variety of the available
  350. menu commands may seem a little overwhelming. Here's a brief
  351. description of the basic features to provide you with a painless
  352. introduction to AMOS menus.
  353.  
  354.  
  355. Setting the title line
  356. ----------------------
  357. The first stage in the creation of a menu is to define the "title
  358. line". THe title line of a menu can be set using the MENU$ command. In
  359. its simplest form this has the format:
  360.  
  361.  
  362.  
  363.                        MENU$ (set a menu title)
  364.  
  365. MENU$(n)=title$
  366.  
  367. MENU$ creates a title line for your menu. Each heading is assigned it's
  368. own individual number starting from one, and increasing from left to
  369. right. So the leftmost title is repsresented by a one, the next title
  370. as two, etc.
  371.  
  372.   The text in "title$" holds the name of the option which will be
  373. displayed in your new menu. Here is a simple example which constructs a
  374. menu line consisting of just two titles: ACTION and MOUSE
  375.  
  376.         Menu$(1)=" Action "
  377.         Menu$(2)=" Mouse "
  378.  
  379. Note the space after "Action" - this will separate it from Mouse, the
  380. next menu along. You must now specify a list of options to be              213
  381. associated with each of your new headings. These form a vertical bar
  382. which will drop into place whenever a title is selected with the mouse.
  383.  
  384.  
  385.  
  386.                     MENU$(t,o)  (set a menu option)
  387.  
  388. MENU$(t,o)=option$
  389.  
  390. This second form of MENU$ defines a set of options which will be
  391. displayed in the menu bar.
  392.  
  393.   t is the number of menu heading which your option will displayed
  394. under. o is the option number you with to install in the menu bar.
  395. All options are numbered downwards from the top of the menu, starting
  396. from one.
  397.  
  398.   The only physical limit to the size of your menu is the amount of
  399. memory, but it's wise to restrict yourself to less than about 10
  400. options for each title. This will keep the complexity of your menus
  401. down to an agreeable minimum.
  402.  
  403.   "option$" holds the name of your new option. This can consist of any
  404. section of text you like. For an example, try adding the following
  405. lines to the program above:
  406.  
  407.         Rem Action menu
  408.         Menu$(1,1)=" Quit "
  409.         Rem Mouse menu
  410.         Menu$(2,1)=" Arrow "
  411.         Menu$(2,2)=" Pointer "
  412.         Menu$(2,3)=" Clock "
  413.         Wait Key
  414.  
  415. This specifies a list of alternatives for the ACTION and the mouse
  416. menus. If you try to run this program as it stands, nothing will
  417. happen. That's because the menus need to be initialised with a call to
  418. the MENU ON command. Enter this thin above program before the Wait Key
  419. instruction. Now run the example and select the menu items with the
  420. mouse cursor. Remember to hold down the RIGHT mouse button first!
  421.  
  422.  
  423.  
  424.                         MENU ON (activate menu)
  425.  
  426. MENU ON
  427.  
  428. Activates a menu defined using the MENU$ command. The menu line will
  429. now appear automatically when the right mouse button is pressed ny the
  430. user. To start the previous menu, insert the following line after the
  431. definition statements.
  432.  
  433.         Menu On
  434.  
  435. Go to the Direct window and play around with the menus. Select options     214
  436. by pressing the right mouse button
  437.  
  438.  
  439. Reading a simple menu
  440. =====================
  441. Once you've created your menu and activated the AMOS menuing system
  442. you'll want to discover which options have been selected by the user.
  443. This can be accomplished using a simple form of the CHOICE command.
  444.  
  445.  
  446.  
  447.                          =CHOICE (read a menu)
  448.  
  449. selected=CHOICE
  450.  
  451. CHOICE returns a value of -1 (true) if the menu has been highlighted by
  452. the user, otherwise 0. It's automatically reset to 0 after each test.
  453. It's also possible to find the title number which has been selected
  454. using a second form of this instruction.
  455.  
  456. heagind=CHOICE(1)
  457.  
  458. "heading" now contains the number of the "title" which has been
  459. highlighted by the user. Similarly you can retrieve the actual option
  460. number which has been chosen with a parameter of two.
  461.  
  462. item=CHOICE(2)
  463.  
  464. Try adding the following lines to the previous example:
  465.  
  466.         Do
  467.           Rem If choice=-1 can be simplified to: If choice, as seen...
  468.           If choice and choice(1)=1 Then Exit
  469.           If choice(1)=2 and choice(2)<>0 Then Change Mouse choice(2)
  470.         Loop
  471.  
  472. This changes the shape of the mouse cursor depending on which option
  473. you have chosen from the menu. A full demonstration of these menu can
  474. be found in the file EXAMPLE 16.2.
  475.  
  476.  
  477. Advanced menuing features
  478. -------------------------
  479. We will now cover some of the more advanced menuing features available
  480. from within AMOS Basic. Used properly these AMOS menus can add a whole
  481. new dimension to your programs.
  482.  
  483.  
  484.  
  485.  
  486.                          MENU$ (create a menu)                             215
  487.  
  488. MENU$(,,)=normal$[,selected$][,inactive$][,background$]
  489.  
  490. Defines the appearance of each individual menu item in one of your
  491. menus. Unlike normal Amiga menus these items are not restricted to
  492. standard text. They can also include embedded commands which allow you
  493. to draw bobs, icons or graphics at any point in the menu line.
  494.  
  495.   Any of the parameters in this instruction may be optionally omitted,
  496. so you can change parts of a menu description indenpendently. A value
  497. of "" in your menu string will ERASE the existing setting. Similarly
  498. you can retain the original value by including a comma at the
  499. appropriate point. For example:
  500.  
  501.         Menu$(1)=" Action ","" : Rem Erase second option
  502.         Menu$(2)=" Mouse 2 ",, : Rem Change title without altering
  503.                                      anything else.
  504.  
  505. The position of the menu item within the actual menu is indicated using
  506. a list of up to eight parameters separated by commas. The general
  507. format is:
  508.  
  509.         (item)/(item,option)/(item,option,sub option)...
  510.  
  511. "normal$" is a string which sets the normal appearance of an item when
  512. it's displayed in the menu. "selected$" changes the effect of
  513. highlighting a menu option with the mouse. As a default, selected items
  514. are printed in inverse text.
  515.  
  516.   "inactive$" changes the appearance of an item which has been
  517. deactivated using the MENU INACTIVE command. If this string is omitted,
  518. all inactive imtes will be displayed in italics. "background$" creates
  519. a background for your menu items when they are initially drawn.
  520. Generally this will be a bo of some sort created with the internal Bar
  521. or line commads.
  522.  
  523.   For now one, we'll abbreviate these parameters using a standard
  524. notation:
  525.  
  526.         setting$=[,selected$][,inactive$][,background$]
  527.  
  528.  
  529. The menu hierarchy
  530. ------------------
  531. The level of an item in the menu is determined by its position in the
  532. menu hierarchy.
  533.  
  534.         Menu$(1)="Title"
  535.         Menu$(1,1)="Option 1"
  536.         Menu$(1,2)="Option 2"
  537.         Menu$(1,2,1)="Item 1"
  538.  
  539. This defines a simple menu. The structure of a menu is similar to that
  540. of an array. Each level of the menu is represented by its own dimension
  541. in the array, and is controlled using a separate version of the MENU$
  542. command.
  543.  
  544.   The first level represents the title line which appears at the top of
  545. your menus. It can be set using a command like:
  546.  
  547.         Menu$(n)=title$[setting$]
  548.  
  549. "n" now corresponds to the position of the title from the left of the      216
  550. screen, and setting$ refers to the three optional strings which define
  551. the general appearance of the menu. It's important to define the title
  552. of your menus first as this *dimensions* the array. All other items may
  553. be created in any order you wish.
  554.  
  555.   Each title is associated with a list of menu options which drop into
  556. view when the menu is selected. These form the second level of the menu
  557. structure and are defined using a second version of the MENU$ command.
  558.  
  559.         Menu$(n,option)=Item$[setting$]
  560.  
  561. "option" holds the number of the item measured from the top left of the
  562. menu bar. There's no limit to the number of options which may be linked
  563. to a single title, other than the amount of available memory.
  564.  
  565.   Each individual option can in turn be associated with its own sub
  566. menus up to a total of eight levels.
  567.  
  568.         Menu$(n,option,sub option)=Item$[setting$]
  569.  
  570. Once you've created a menu it can be expanded or changed at any point
  571. in your program. Never change the current screen while you are creating
  572. a menu as this will lead to an error message. 
  573.  
  574. See EXAMPLE 16.3
  575.  
  576.  
  577.  
  578.                           =CHOICE (read menu)
  579.  
  580. item=CHOICE[(dimension)]
  581.  
  582. The CHOICE function checks whether an option has been highlighted on
  583. the current menu. If an item has been selected (down to the lowest
  584. level), CHOICE will return a value of -1, otherwise it will be 0. After
  585. you've called this function, the status of the menu will be
  586. automatically restored to 0 (false). This stops a single menu access
  587. from being accidentally detected several times.
  588.  
  589.   The second form of this command returns the option selected at the
  590. required level.
  591.  
  592. item=CHOICE(dimension)
  593.  
  594. "dimension" indicates the level of the menu which is to be read. As you
  595. may recall, a level number of 1 corresponds to the title line of the
  596. menu. Similartly the levels between 2 and 8 indicate the number of an
  597. ioption which has been chosen. If a menu item has not been selected,
  598. "item" will be loaded with a value of zero. For example:
  599.  
  600.         Menu$(1)="Menu"
  601.         Menu$(1,1)="Option 1"
  602.         Menu$(1,2)="Option 2"
  603.         Menu$(1,2,1)="Option 2.1"
  604.         Menu On
  605.         Do
  606.           If choice Then Print choice(1),choice(2),choice(3)
  607.         Loop
  608.  
  609. If you wanted to implement larger menus with this system, your program
  610. would need to use a long list of IF...THEN statements to deal with each
  611. and every possibility. This would cause a small but significant delay
  612. in your program while the menus were being read. It would also make it
  613. very difficult to amend your program later. Fortunately AMOS Basic
  614. provides you with a painless method of managing even the largest menus.
  615.  
  616.  
  617.  
  618.                 ON MENU PROC (automatic menu selection)                    217
  619.  
  620. ON MENU PROC proc1 [,proc2,...]
  621.  
  622. Each title in your menu can be assigned its own procedure which will be
  623. executed automatically whenever an option is selected by the user. The
  624. action of this command is similar to the code below:
  625.  
  626.         If Choice
  627.           If Choice(1)=1
  628.             Proc1
  629.           Endif
  630.           If Choice(1)=2
  631.             Proc2
  632.           Endif
  633.         :  :  :
  634.         :  :  :
  635.         Endif
  636.  
  637. There is one crucial difference between the ON MENU command and the
  638. above instructions. ON MENU is performed 50 times a second using
  639. interrupts and does not affect the overall running of your program.
  640. This means that your program can be doing something totally different
  641. while the menus are being checked by the system.
  642.  
  643. Whenever the user selects a menu item the required procedure will be
  644. immediately executed with no further ation on the part of your program.
  645. Your procedure can then use the CHOICE command to find which option has
  646. been chosen and perform the appropriate action. 
  647.  
  648.   After the procedure has concluded, your program will be returned to
  649. the instruction following the ON MENU call. Here's an example:
  650.  
  651.         Menu$(1)="Action" : Menu$(1,1)="Count" : Menu$(1,2)="Quit"
  652.         Menu On : Rem Activate menu
  653.         On Menu Proc ACTION
  654.         On Menu On : Rem Activate On Menu command
  655.         Do     
  656.           X$=Inkey$ : If X$<>"" Then Print X$;: Inc W
  657.         Loop
  658.         Procedure ACTION                                                   218
  659.           Shared W
  660.           If Choice(2)=1
  661.             Locate 0,0 : Print "You typed ";W;" letters" : W=0
  662.             On Menu On : Rem Initialise menus
  663.           Endif
  664.           If Choice(2)=2 Then Edit
  665.         End Proc
  666.  
  667. There are a couple of important points to note about this example.
  668. Firstly, see how the on menu sequence is activated using the ON MENU ON
  669. command. This *must* be called after the menu handling procedure has
  670. finished as it's needed to restart the menuing system. Also note the
  671. use of INKEY$ rather than INPUT. The INPUT command will halt the menu
  672. checks while you are entering a line. All other commands can be used
  673. without problems, including WAIT, WAIT VBL and WAIT KEY. For a further
  674. example see EXAMPLE 16.4
  675.  
  676.  
  677.  
  678.                ON MENU GOSUB (automatic menu selection)
  679.  
  680. ON MENU GOSUB label1 [,label2,...]
  681.  
  682. Enters one of a list of subroutines depending on the option which has
  683. been selected by the user. Once you've called this command and created
  684. your subroutines, the menus will be checked automatically 50 times a
  685. second.
  686.  
  687.   Note that each title on the menu line is handled by its own
  688. individual subroutine. This differs from its AMIGA Basic equivalent
  689. which controls the entire menu with just a single routine.
  690.  
  691.   After using this command you should activate the menuing system with
  692. a call to the ON MENU. The menus must be reinitialised in this way
  693. before jumping back to the main program with RETURN. Also note that
  694. label *MAY NOT* be replaced by an expression as the label will only be
  695. evaluated once when the program is run.
  696.  
  697.  
  698.  
  699.                 ON MENU GOTO (automatic menu selection)
  700.  
  701. ON MENU GOTO label1 [,label2,...]
  702.  
  703. This command has now been superceded by the more powerful ON MENU PROC
  704. and ON MENU GOSUB instructions. It's intended to provide compability
  705. with programs written in STOS Basic. WHen ever a menu is selected, the
  706. program wlil jump to the appropriate label.
  707.  
  708.  
  709.  
  710.                 ON MENU ON/OFF ([de]activate automatic
  711.                             menu selection)
  712. ON MENU ON
  713.  
  714. Activates the automatic menuing system created by the ON MENU
  715. PROC/GOSUB/GOTO commands. After a sub-routine has been accessed in this
  716. way, the system will be DISABLED. So it's vital to reactivate the
  717. system with ON MENU ON before returning to the main program.
  718.  
  719. ON MENU OFF
  720.  
  721. This temporarily freezes the automatic menuing system. It's useful when
  722. your program is executing a procedure which needs to be performed
  723. without interruptions - such as loading and saving information to the
  724. disc. The menus can be reactivated using ON MENU ON.
  725.  
  726.  
  727.  
  728.             ON MENU DEL (dlete the labels used by ON MENU)                 219
  729.  
  730. ON MENU DEL
  731.  
  732. This erases the internal list of labels or procedures created by the ON
  733. MENU commands. You can now redirect your menus to another part of your
  734. program using a further call to ON MENU. WARNING! Only use this command
  735. after you've deactivated the menus with ON MENU OFF.
  736.  
  737.  
  738. Keyboard shortcurs
  739. ------------------
  740. Despite the undoubted appeal of menus, some users prefer to call up the
  741. options of a program straight from the keyboard. Althought menus are
  742. certainly easy for beginners, once you've familiarised yourself with a
  743. program it can be much faster to call up an option from the keyboard.
  744.  
  745.   AMOS Basic allows you to assign a keyboard shortcut to any of your
  746. menu items. These keystrokes are interpreted exactly as if the user had
  747. accessed the equivalent option from the menu. They can be used with any
  748. of the AMOS Basic menuing commands, including ON MENU.
  749.  
  750.  
  751.  
  752.                 MENU KEY (assign a key to a menu item)
  753.  
  754. MENU KEY(,,) TO c$
  755. MENU KEY(,,) TO scan[,shift]
  756.  
  757. This allows you to assign any key to any item in a previously defined
  758. menu. The only restriction is that item you have specified must be at
  759. the bottom level of our menu. So you can't use a shortcut to select a
  760. sub menu as each command must correspond to a single option in the
  761. menu.
  762.  
  763.   c$ is a string containing a single character which is to be assigned
  764. to the menu option. Any additional characters in the string will be
  765. ignored.
  766.  
  767.   Each key on the Amiga's keyboard is assigned its own individual
  768. scancode. By using this code you can assign keys to a menu which have
  769. no Ascii equivalents. Here is a list of scancodes which can be used
  770. with your menus.
  771.  
  772.         Scancode  Keys
  773.         --------  ----
  774.         80 - 89   Function keys F1-F10
  775.            95     Help
  776.            69     Esc
  777.  
  778. "shift" is an optional bitmap which allows you to check for control key    220
  779. combinations such as ALT+HELP or CONTROL+D. The format of "shift" is:
  780.  
  781.         Bit  Key Tested      Notes
  782.         ---  ----------      -----
  783.          0   Left SHIFT      Only one shift key can be tested at a time
  784.          1   Right SHIFT
  785.          2   Caps Lock       Either ON or OFF
  786.          3   CTRL
  787.          4   Left ALT
  788.          5   Right ALT
  789.          6   Left AMIGA      C= key on some keyboards
  790.          7   Right AMIGA
  791.  
  792. Note that if you set more than a single bit in this pattern, you'll
  793. have to press several keys simultaneously to call up your menu item.
  794. Any of these short-cuts can be deactivated by using MENU KEY with no
  795. parameters. For example:
  796.  
  797.         Menu Key(1,10)
  798.  
  799. With the help of MENU KEY command, adding shortcuts to a menu is a
  800. trivial operation, so you are strongly recommended to include them as
  801. standard in your programs. Here is an example that checks for the
  802. Amiga's 10 function keys:
  803.  
  804.         Menu$(1)=" Function Keys "
  805.         For A=1 To 10
  806.           OPT$=" F"+Str$(A)+" "
  807.           Menu$(1,A)=OPT$
  808.           Menu Key(1,A) To 79+A
  809.         Next A
  810.         Menu On
  811.         Do
  812.           If Choice Then Print "You pressed function key ";Choice(2)
  813.         Loop
  814.  
  815.  
  816. Menu control commands
  817. ---------------------
  818.  
  819.  
  820.                        MENU ON (activate a menu)
  821.  
  822. MENU ON [bank]
  823.  
  824. Activates a menu which has been previously defined in your program. The
  825. menu will be displayed when the user next presses the right mouse
  826. button, and the options can be selected in the usual way. If a "bank"
  827. number is included with the instruction, then the menu will be taken
  828. from the appropriate memory bank. See MAKE MENU BANK for more details.
  829.  
  830.  
  831.  
  832.                MENU OFF (temporarily deactivate a menu)                    221
  833.  
  834. MENU OFF
  835.  
  836. THis is the opposite of the MENU ON command. It temporarily freezes the
  837. action of the entire menu. The menu can be restared at any time using
  838. the MENU ON command.
  839.  
  840.  
  841.  
  842.                MENU DEL (delete one or more menu items)
  843.  
  844. Erases the selected menu from the Amiga's memory and restores the space
  845. to the rest of your program. There are two possible formats.
  846.  
  847. MENU DEL
  848.  
  849. Erases the enitre menu. WARNING! This command is irrevocable!
  850.  
  851. MENU DEL(,,)
  852.  
  853. Deletes just a section of the menu. The (,,) parameters contain a list
  854. up to eight values separated by commas. These indicate the precise
  855. position of the item in the menu hierarchy. For example:
  856.  
  857.         Menu Del(1) : Rem Erase title number 1
  858.         Menu Del(1,2) : Rem Erase option 2 of title 1
  859.  
  860.  
  861.  
  862.                 MENU TO BANK (save the menu definitions
  863.                            in a memory bank)
  864.  
  865. MENU TO BANK n
  866.  
  867. This instruction allows you to save an entire menu tree into memory
  868. bank n. If bank n already exist, you'll get a "bank already reserved"
  869. error.
  870.  
  871.   Once you've stored a menu in this way, it will be saved automatically
  872. along with your Basic program. By storing your menu definitions in a
  873. memory bank, you can reduce the size of your program listings
  874. significantly. This will free valuable space in the editors memory, and
  875. will allow you to write longer Basic programs using exactly the same
  876. amount of memory.
  877.  
  878.  
  879.  
  880.                BANK TO MENU (restores a menu definition
  881.                          saved in a menu bank)
  882.  
  883. BANK TO MENU n
  884.  
  885. Sets up a menu definition from menu data stored in bank number n. You
  886. menu will be restored to exactly the same state as it was originally
  887. saved. If the menu is complex, this process may take a little time. To
  888. activate your ne menu call the MENU ON instruction.
  889.  
  890.  
  891.  
  892.                     MENU CALC (recalculate a menu)                         222
  893.  
  894. MENU CALC
  895.  
  896. One of the nicest features of AMOS menus is that they can be easily
  897. changed during the course of a program. After you've created your
  898. initial definition you can add new items and replace existing options
  899. as well.
  900.  
  901.   Al your menu items are automatically repositioned when the menu is
  902. selected with the right mouse button. If your menus are extremely large
  903. this may takek a little time. MENU CALC allows you to perform this
  904. process at the most appropriate point in your program, and avoid
  905. unnecessary and unwanted delays.
  906.  
  907.   Note that in order to stop the user calling the menu while it's being
  908. changed, you are strongly adviced to freeze the menus with MENU OFF at
  909. the start of your procedure. The menu can then be safely restarted
  910. using the MENU ON command after you've finished. Evolving menus are
  911. particularly useful for adventure games as each location can have its
  912. own individul menu options which can be updated depending on the
  913. player's actions.
  914.  
  915.  
  916.  
  917. Embedded menu commands
  918. ======================
  919. Any menu string can optionally include a powerful set of embedded
  920. commands which allow you to customize the appearance of your menus to
  921. an incredible degree. The list of commands in enclosed between sets of
  922. round brackets () and individual instructions are separated using
  923. colons ":". For example:
  924.  
  925.         Menu$(1)="(Locate 10,10 : Ink 1,1) Hello"
  926.  
  927. Each instruction consists of just two characters which can be in either
  928. upper or lower case. Anything else will be ingnored completely. Most
  929. commands also require you to input one or more commands. These numbers
  930. *must never* make use of expressions as these are not evaluated. The
  931. commands are listed below.
  932.  
  933.   Note: In the syntax the two important characters which make up the
  934. command are in upper case and highlighted bold.
  935.  
  936.  
  937.  
  938.                            BOB (draw a bob)
  939.  
  940. BOb n
  941. --
  942. The BOB command draws a bob number n at the current cursor position. No
  943. accound is taken of the hot spot of the bob. All coordinates are
  944. measured relative to the top left corner. Also note that colour zero is
  945. usually treated as transparent. This may be changed using the NOMASK
  946. command from AMOS Basic. For example:
  947.  
  948.         Load "AMOS_DATA:Sprites/Octopus.abk"
  949.         Menu$(1)="(Bob 1) 1":Menu$(1,1)="(Bob 2) 2"
  950.         Menu$(1,2)="(Bob 3) 3"
  951.         Menu On : Wait Key
  952.  
  953.  
  954.  
  955.                           ICON (draw an icon)
  956.  
  957. ICon n
  958. --
  959. Draws icon # n at the current cursor position. Note that unlike bobs,
  960. colour zero is NOT normally transparent. See the Basic MAKE ICON MASK
  961. for more details.
  962.  
  963.  
  964.  
  965.                    LOCATE (move the graphics cursor)                       223
  966.  
  967. LOcate x,y
  968. --
  969. Tis command moves the graphics cursor to coordinates x,y measured
  970. relative to the top left corner of the menu line. Note that after an
  971. instruction the graphics cursor will always be positioned at the bottom
  972. right of the object which has just been drawn. These coordinates will
  973. also be used to determine the location of any further items in your
  974. menu like so:
  975.  
  976.         Menu$(1)="Example ":Menu$(1,1)="Locate (Lo 50,50) in action "
  977.         Menu$(1,2)="Guess my coords"
  978.         Menu On : Wait Key
  979.  
  980.  
  981.  
  982.                     INK (set Ink and Paper colours)
  983.  
  984. INk n,value
  985. --
  986. The INK command assigns the colour indexes to be used for the PEN,
  987. PAPER and OUTLINE colours, Here's a list of the various possibilities:
  988.  
  989.         n       Effect
  990.         -       ------
  991.         1       Set text PEN colour
  992.         2       Set PAPER colour
  993.         3       Set OUTLINE colour
  994.  
  995.  
  996.  
  997.                            SFONT (set font)
  998.  
  999. SFont n
  1000. --
  1001. SFont sets the current font to *graphics* font number n. This will be
  1002. used in all future menu items. NOte that you MUST call GET FONTS before
  1003. this instruction is executed, otherwise it can only use the two rom
  1004. fonts. See EXAMPLE 16.5.
  1005.  
  1006.  
  1007.  
  1008.                         SSTYLE (set font style)
  1009.  
  1010. SStyle n
  1011. --
  1012. This command sets the style of the current font to n which is a
  1013. bit-pattern in the following format:
  1014.  
  1015.         Bit    Effect
  1016.         ---    ------
  1017.          0     Underline
  1018.          1     Bold
  1019.          2     Italic
  1020.  
  1021.  
  1022.  
  1023.                           LINE (draw a line)                               224
  1024.  
  1025. LIne x,y
  1026. --
  1027. The LINE command draws a line from the current cursor position to the
  1028. graphics coordinates x,y. See EXAMPLE 16.6
  1029.  
  1030.  
  1031.  
  1032.                        SLINE (set line pattern)
  1033.  
  1034. SLine p
  1035. --
  1036. Sets the line style used in all subsequent LINE comands to the bit
  1037. pattern held in p. Since there is no expession evaluation, this pattern
  1038. should always be converted into decimal notation before use. A simple
  1039. demonstration of the possible line styles can be found in EXAMPLE 16.7.
  1040.  
  1041.  
  1042.  
  1043.                            BAR (draw a bar)
  1044.  
  1045. BAr x,y
  1046. --
  1047. This draws a rectangular bar from the current cursor coordinates to
  1048. x,y. See EXAMPLE 16.8.
  1049.  
  1050.  
  1051.  
  1052.                  OUTLINE (enclose bar with an outline)
  1053.  
  1054. OUtline flag
  1055. --
  1056. Draws a border in the current outline colour (ink 3) around all
  1057. subsequent bars. A value of one activates the border and 0 removes it.
  1058.  
  1059.  
  1060.  
  1061.                        ELLIPSE (draw an ellipse)
  1062.  
  1063. ELlipse r1,r2
  1064. --
  1065. Draws an oval with radii r1 and r2 at the current cursor coordinates.
  1066. To draw a circle, set r1 equal to r2. See example 16.9.
  1067.  
  1068.  
  1069.  
  1070.                         PROC (call a procedure)                            225
  1071.  
  1072. PRoc NAME
  1073. --
  1074. The PROC instruction allows you to call any AMOS Basic procedure
  1075. directly within a menu line. The called procedure must NOT include
  1076. paramters, otherwise a syntax error will be indicated.
  1077.  
  1078.   This command allows you to customize the menu precisely to your own
  1079. needs without having to limit yourself to the available menu commands.
  1080. In order to exploit these features, you'll need to understand a little
  1081. bit of theory.
  1082.  
  1083.   At the start of your procedure the following values are held in the
  1084. 68000's processor registers.
  1085.  
  1086.         Dreg(0)         X-Coord
  1087.  
  1088.   This holds the graphical X coordinate of the top left corner of the
  1089.   current menu item. Don't draw your gfxs over the part of the screen
  1090.   to the left of this point as this will confuse the menu redrawing
  1091.   process and may lead to unwanted effects.
  1092.  
  1093.         Dreg(1)         Y-Coord
  1094.  
  1095.   Contains the Y coordinate of your menu item. As with the X coordinate
  1096.   you should always limit your drawing operations to the region below
  1097.   this point to avoit possible errors.
  1098.  
  1099.         Dreg(2)         Status of drawing operations
  1100.  
  1101.   This register holds the current status of the menu operations. If it
  1102.   contains a value of 0 (false) the menu item is being drawn. In this
  1103.   case you will need to load Dreg(0) and Dreg(1) with the coordinates
  1104.   of the bottom right corner of your menu zone and return from the
  1105.   procedure immediately. If Dreg(0) is -1 (true) you are free to
  1106.   perform your gfx operations used by your procedure. After you have
  1107.   finished you should return the coordinates of the bottom right corner
  1108.   of your item in Dreg(0) and Dreg(1) as before.
  1109.  
  1110.         Dreg(3)         Status of menu item
  1111.  
  1112.   D3 is loaded with a value of -1 if the menu is highlighted and the
  1113.   first menu string is displayed, otherwise it will contain a value 0.
  1114.  
  1115.         Dreg(4)
  1116.  
  1117.   D4 is set to TRUE when the menu branch is initially opened.
  1118.  
  1119.         Areg(1)         Address of reserved zone
  1120.  
  1121.   This is the address of the zone created with RESERVE. It's used to       226
  1122.   allow several procedures to communicate with each other. See RESERVE
  1123.   for more details.
  1124.  
  1125.  
  1126.   The general structure of a menu procedure is:
  1127.  
  1128.         Procedure ITEM
  1129.           If DREG(2)
  1130.             X=DREG():Y=DREG(1)
  1131.              ...draw the item...
  1132.           Endif
  1133.           DREG(0)=BX
  1134.           DREG(1)=BY
  1135.         End Proc
  1136.  
  1137. The dimensions of the menu item as displayed on the screen are set
  1138. using the coordinates BX and BY. These MUST be loaded into registers D0
  1139. and D1 before leaving your procedure as they are needed to create the
  1140. final menu bar.
  1141.  
  1142.   While inside your procedure you can perform most AMOS instructions
  1143. including other procedures. But some instructions are absolutely
  1144. forbidden! If you use these commands, you won't get an error message
  1145. but your AMIGA may crash unexpectedly!
  1146.  
  1147.  * NEVER change the current screen inside a menu.
  1148.  * Don't set or reset a screen zone
  1149.  * Avoid using instructions such as WAIT, WAIT KEY, INPUT or INKEY$
  1150.  * Disc operations are absolutely forbidden!
  1151.  * Any error trapping in your procedure will be ignored.
  1152.  
  1153.   Used with caution, the PROC command can procedure some mind-blowing
  1154. effects. For a demonstration, load EXAMPLE 16.10. 
  1155.  
  1156.  
  1157.  
  1158.                      RESERVE (reserve a local data
  1159.                          area for a procedure)
  1160. REserve n
  1161. --
  1162. Reserves n bytes of memory for this menu item. This area can be
  1163. accessed from within your menu procedure using the address held in
  1164. AREG(1). The data area you have created is common to all the strings in
  1165. the current menu object. It can be used to exchange parameters between
  1166. the various procedures called by a menu item.
  1167.  
  1168.  
  1169.  
  1170.              MENU CALLED (redraw a menu item continually)
  1171.  
  1172. MENU CALLED(,,)
  1173.  
  1174. Automatically redraws the selected menu item 50 times a second whenever
  1175. it's displayed on the screen. It's usually used in conjunction with a
  1176. menu procedure to generate animated menu items which change in front of    227
  1177. your eyes.
  1178.  
  1179.   In order to make use of this function, you first need to define a
  1180. menu procedure, using the principles outlined above. Then add a call to
  1181. this procedure in the required title strings using an embedded
  1182. MENU CALL. When the user displays the chosen item, your procedure will
  1183. be repeatedly accessed by the menuing system.
  1184.  
  1185.   Since your procedure will be called 50 times a second, it should
  1186. obviously return back to the menu as quickly as possible. This will
  1187. allow enough time for the rest of the menu to be succesfully updated.
  1188.  
  1189.   Also note that your embedded procedure can safely animate your item
  1190. using either bobs or sprites. However, as the menu items are NOT double
  1191. buffered, your bobs may flicker slightly on the screen. So it may be
  1192. better to use computed sprites for this purpose instead. Another
  1193. approach is to draw your display with the standard AMOS graphics
  1194. commands. An example of this can be seen in EXAMPLE 16.11.
  1195.  
  1196.  
  1197.  
  1198.                MENU ONCE (turns off automatic redrawing)
  1199.  
  1200. MEUN ONCE(,,)
  1201.  
  1202. Turns off the automatic updating system started using the MENU CALLED.
  1203.  
  1204.  
  1205. Alternative menu styles
  1206. =======================
  1207. Normally the titles of a menu are displayed as a horizontal line and
  1208. the options are arranged below it in a vertical menu bar. If you want
  1209. to create something a little unusual, you can change the format of each
  1210. level of your menu using the following three instructions:
  1211.  
  1212.  
  1213.  
  1214.                        MENU LINE (display a menu
  1215.                     as a horizontal line of items)
  1216. MENU LINE level
  1217. MENU LINE(,,)
  1218.  
  1219. Displays the menu options at the requested level in the form of a
  1220. horizontal line. This menu line starts from the left-hand corner of the
  1221. first title and stretches to the bottom right corner of the last.
  1222.  
  1223. MENU LINE level
  1224.  
  1225. Defines the menu style of an entire level of your menu. This sould only
  1226. be called during your menu definitions.
  1227.  
  1228. MENU LINE (,,)
  1229.  
  1230. Normally one would only use the "level" version for this command.
  1231. Setting individual items to Line and Bar can give bizarre results, but
  1232. this may be useful for something!
  1233.  
  1234.  
  1235.  
  1236.               MENU TLINE (display a menu as a total line)                  228
  1237.  
  1238. MENU TLINE level
  1239. MENU TLINE(,,)
  1240.  
  1241. Displays a section of the menu as a "total line" stretching from the
  1242. very left of the screen to the very right. The entire line will be
  1243. drawn even when the rist item is in the middle of the screen.
  1244.  
  1245.   "level" is a number ranging from 1 to 8 which specifies the part of
  1246. the menu to be affected. This is the standard form of the instruction,
  1247. and should be called during your menu definitions as otherwise it will
  1248. have no effect.
  1249.  
  1250.   You can also change the appearance of a menu after it has been vrated
  1251. using a second form of this command. For example,
  1252.  
  1253.         Menu Line(1,1) : Rem Displays menu 1,1 as a line.
  1254.  
  1255.  
  1256.  
  1257.                   MENU BAR (display a section of the
  1258.                             menu as a bar)
  1259.  
  1260. MENU BAR level
  1261. MENU BAR(,,)
  1262.  
  1263. This displays the selected menu items in the form of a vertical bar.
  1264. The width of this bar is automatically set to the dimensions of the
  1265. largest item in your menu.
  1266.  
  1267.   "level" is a number which indicates which part of the current menu
  1268. definition is to be affected. As a default this option is used for
  1269. levels 2 to 8 in your menu. Note that this form of the MENU BAR
  1270. instruction may only be used during your programs initialisation phase.
  1271.  
  1272.   (,,) is a list of parameters which allow you to change the style of
  1273. your menus once they've been installed. Here's an example of Menu Bar
  1274. and Menu Tline:
  1275.  
  1276.         FLAG=0
  1277.         SET_MAN
  1278.         Do
  1279.           If Choice and Choice(1)=2 And Choice(2)=1 Then ALTER
  1280.         Loop
  1281.         Procedure SET_MEN
  1282.           Menu$(1)=" Bar Demo " : Menu$(2)=" Select Below "
  1283.           Menu$(1,1)=" I do nothing! "
  1284.           Menu$(2,1)=" Yes, press on me! "
  1285.           Menu On
  1286.         End Proc
  1287.         Procedure ALTER
  1288.           Shared ALTER
  1289.           Menu Del
  1290.           If FLAG=0 Then Menu Bar 1 : Flag=1 Else Menu Tline 1 : Flag=0
  1291.           SET_MEN
  1292.         End Proc
  1293.  
  1294.  
  1295.  
  1296.                   MENU INACTIVE (turn off menu item)                       229
  1297.  
  1298. MENU INACTIVE level
  1299. MENU INACTIVE(,,)
  1300.  
  1301. As its name suggests, MENU INACTIVE deactivates a series of options in
  1302. your menu. Any subsequent attempts to select these items will be
  1303. completely ignored. "level" allows you to deactivate an entire section
  1304. of the menu and you can also deactivate individual menu options with
  1305. the parameters (,,). These indicate the precise position of your item
  1306. in the current menu hierarchy.
  1307.  
  1308.   Note that the menu items you've turned off with the instruction will
  1309. be immediately replaced by the INACTIVE$ string you specified during
  1310. your original menu definition. If this was omitted, any unavailable
  1311. menu options will be shown in italics.
  1312.  
  1313.  
  1314.  
  1315.                   MENU ACTIVE (activate a menu item)
  1316.  
  1317. MENU ACTIVE level
  1318. MENU ACTIVE(,,)
  1319.  
  1320. Simply reverses the effect of a previous MENU INACTIVE command. After
  1321. you've called this instruction, the selected options will automatically
  1322. redisplayed using their original title strings.
  1323.  
  1324.  
  1325. Moveable menus
  1326. ==============
  1327. AMOS menus can be displayed at any point on the screen. Menus can be
  1328. moved either explicity by your program or directly by the user.
  1329.  
  1330.  
  1331.  
  1332.             MENU MOVABLE (activate automatic menu movement)
  1333.  
  1334. MENU MOVABLE level
  1335. MENU MOVABLE(,,)
  1336.  
  1337. Informs the menuing system that the menu items at "level" may be moved
  1338. directly by the user - this is the default.
  1339.  
  1340.   The second form of this command allows you to set the status of each
  1341. individual item in the menu. The parameters between the brackets can
  1342. indicate any position in the menu hierarchy.
  1343.  
  1344.   Any menu may be repositioned by moving the mouse pointer over the
  1345. FIRST item in the menu and pressing the left mouse button. A
  1346. rectangular box will now appear around the selected menu item, and this
  1347. may be moved to nay point on the current screen. When you release the
  1348. left button the menu will be redrawn at the new position along with all
  1349. the associated menu items.
  1350.  
  1351.   Note that this command does not allow you to change the arrangement
  1352. of any items below this level. If you want to manipulate the individual
  1353. menu options you'll need to use a seaparate MENU ITEM command. See
  1354. EXAMPLE 16.12 for a demonstration of this system.
  1355.  
  1356.  
  1357.  
  1358.                   MENU STATIC (fix a menu into place)                      230
  1359.  
  1360. MENU STATIC level
  1361. MENU STATIC(,,)
  1362.  
  1363. Defines the menu at "level" to be immoveable by the user. One problem
  1364. with moveable menu is that the amount of the memory they consume will
  1365. change during the course of a program. If your menus are particularly
  1366. large, or if memory is running tight, this can cause real problems as a
  1367. single careless action by the user will abort your program with an
  1368. "out of memory" error. With the help of the MENU STATIC command you can
  1369. avoid this difficulty completely.
  1370.  
  1371.  
  1372.  
  1373.                         MENU ITEM MOVABLE (move
  1374.                        individual menu options)
  1375.  
  1376. MENU ITEM MOVABLE level
  1377. MENU ITEM MOVABLE(,,)
  1378.  
  1379. This command is similar to MENU MOVABLE except that it allows you to
  1380. re-arragne the various options in a particular level. So all the items
  1381. in a menu bar may been individually repositioned by the user. 
  1382.  
  1383.   Normally it's illefal to move the items outside the current menu bar,
  1384. but this can be overridden using the MENU SEPARATE command.
  1385.  
  1386.   In order for the menu items to be moveable, the WHOLE menu bar must
  1387. also be moveable. So if you fix the MENU into palce with MENU STATIC,
  1388. this command will have no effect. Additionally you can't move the first
  1389. item in the menu bar as this will move the entire line. Another side
  1390. effect is that moving the last menu item will permanently reduce the
  1391. size of your menu bar. There are two possible solutions:
  1392.  
  1393.  * Enclose your entire bar with a rectangular box like so:
  1394.  
  1395.         Menu$(1,1)=,,,"(Bar 40,100)(Loc 0,0)"
  1396.  
  1397. Where MENU$(1,1) is the first item in your current bar.
  1398.  
  1399.  * Set the last item into place with MENU ITEM STATIC.
  1400.  
  1401.  
  1402.  
  1403.                   MENU ITEM STATIC (static menu item)
  1404.  
  1405. MENU ITEM STATIC level
  1406. MENU ITEM STATIC(,,)
  1407.  
  1408. This command locks one or more menu items firmly into place and is the
  1409. default setting.
  1410.  
  1411.  
  1412.  
  1413.              MENU SEPARATE (separate a list of menu items)                 231
  1414.  
  1415. MENU SEPARATE level
  1416. MENU SEPARATE(,,)
  1417.  
  1418. Tells AMOS to separate all the items in the current level. Each item in
  1419. your menu istreated completely independently from the previous one. If
  1420. you haven't defined a background string, each item will be offset by
  1421. two pixels from the one above. This creates an attractive stepped
  1422. effect which can be removed by editing the menu with the MENU
  1423. Accessory.
  1424.  
  1425.   The optional parameters to this instruction allow you to split a menu
  1426. bar at any point in the line. Once you've separated an item it will be
  1427. affected by the MENU MOVABLE commands rather than ITEM instructions.
  1428.  
  1429.  
  1430.  
  1431.                  MENU LINKED (link up a set of menus)
  1432.  
  1433. MENU LINKED level
  1434. MENU LINKED(,,)
  1435.  
  1436. This links one or more menu items together. It's the opposite of the
  1437. MENU SEPARATE instruction.
  1438.  
  1439.  
  1440.  
  1441.               =MENU X (return the graphical X coordinate
  1442.                            of an menu item)
  1443.  
  1444. x=MENU X(,,)
  1445.  
  1446. The MENU X function allows you to retrieve the position of a menu item
  1447. relative to the previous option on the screen. You can use this
  1448. information to implement powerful menus such as the one found in
  1449. EXAMPLE 16.13.
  1450.  
  1451.  
  1452.  
  1453.               =MENU Y (return the graphical Y coordinate
  1454.                             of a menu item)
  1455.  
  1456. x=MENU Y(,,)
  1457.  
  1458. Returns the Y coordinate of a menu option. note that all coordinates
  1459. are measured relative to the previous item. So this is NOT a standard
  1460. screen coordinate!
  1461.  
  1462.  
  1463. Moving a menu within a program
  1464. ==============================
  1465.  
  1466.  
  1467.              MENU BASE (move the starting point of a menu)
  1468.  
  1469. MENU BASE x,y
  1470.  
  1471. This command moves the starting point of the first level of your menus
  1472. to the absolute csreen coordinates x,y. All subordatine menu items will
  1473. be displayed at their curent positions relative to the top of your
  1474. menu. See EXAMPLE 16.14 for a demonstration of the MENU BASE command in
  1475. action.
  1476.  
  1477.  
  1478.  
  1479.                         SET MENU (move a menu)                             232
  1480.  
  1481. SET MENU (,,) TO x,y
  1482.  
  1483. Sets the coords of the top left corner of a menu item. These
  1484. coordinates are measured relative to the previous level. The starting
  1485. point for the entire menu (coords 0,0) may be set with the MENU BASE
  1486. command.
  1487.  
  1488.   All the lvels of the menu below your menu wlil also be moved by this
  1489. instruction. Their relative positons will be unchanged. SInce x,y can
  1490. be negative numbers, it's possible to arrange the items in a menu bar
  1491. in the form of a control panel - see EXAMPLE 16.15.
  1492.  
  1493.  
  1494.  
  1495. Displaying a menu at the cursor position
  1496. ========================================
  1497.  
  1498.  
  1499.              MENU MOUSE (display the menu under the mouse)
  1500.  
  1501. MENU MOUSE ON/OFF
  1502.  
  1503. The MENU MOUSE features automatically display all menus starting from
  1504. the current position of the mouse cursor. The mouse coordinates are
  1505. added to the MENU BASE to get the final position, so it's possible to
  1506. place the menu a fixed distance away from the mouse pointer if
  1507. required. See EXAMPLE 16.16.
  1508.